import { _decorator, Component, Node, Prefab, instantiate, AudioSource, Label, Vec3, tween, find } from 'cc'; // 添加 Vec3 和 tween 导入
const { ccclass, property } = _decorator;

@ccclass('hall')
export class hall extends Component {
    @property(Prefab) // 声明预制体变量
    settingsPrefab: Prefab = null; // 用于绑定大厅的设置预制体

    @property(AudioSource) // 添加新的属性用于绑定音乐控件
    backgroundMusic: AudioSource = null;

    @property(Label) // 绑定文本控件
    randomIdLabel: Label = null; // 声明用于显示 randomId 的 Label 变量

    @property(Label) // 绑定名称文本控件
    nameLabel: Label = null; // 声明用于显示名称的 Label 变量

    @property(Label) // 绑定滚动公告控件
    scrollLabel: Label = null; // 声明用于显示滚动公告的 Label 变量

    private readonly startX: number = 245; // 滚动公告的起始 X 坐标
    private readonly endX: number = -235; // 滚动公告的结束 X 坐标
    private readonly scrollDuration: number = 3; // 滚动动画持续时间（秒）
    private readonly waitDuration: number = 1; // 等待时间（秒）

    private socket: WebSocket;

    start() {
        // 初始化时播放背景音乐
        this.playBackgroundMusic();
        console.log('randomIdLabel:', this.randomIdLabel); // 输出 randomIdLabel，检查是否为 null
        this.startScrollAnimation(); // 开始滚动动画
        this.connectToServer();
        this.requestAnnouncement();
    }

    update(deltaTime: number) {
        
    }

    // 有这个函数就够了
    onButtonClick() { // 按钮点击事件处理函数
        if (this.settingsPrefab) { // 检查预制体是否存在
            const settingsInstance = instantiate(this.settingsPrefab); // 实例化预制体
            this.node.addChild(settingsInstance); // 将实例化的预制体添加到当前节点
        }
    }

    // 添加新方法用于播放背景音乐
    playBackgroundMusic() {
        if (this.backgroundMusic) {
            // 确保音乐没有在播放中
            if (!this.backgroundMusic.playing) {
                this.backgroundMusic.play();
            }
        } else {
            console.warn('背景音乐组件未设置');
        }
    }

    // 新增方法：设置随机ID和名称
    setRandomId(randomId: number, name: string) {
        if (this.randomIdLabel) { // 检查 randomIdLabel 是否为 null
            this.randomIdLabel.string = `${randomId}`; // 更新 Label 显示的文本
            console.log('设置的随机ID:', randomId); // 输出设置的随机ID到控制台，方便调试
        } else {
            console.warn('randomIdLabel 为空，无法设置随机ID'); // 输出警告信息
        }

        if (this.nameLabel) { // 检查 nameLabel 是否为 null
            this.nameLabel.string = `${name}`; // 更新名称 Label 显示的文本
            console.log('设置的名称:', name); // 输出设置的名称到控制台，方便调试
        } else {
            console.warn('nameLabel 为空，无法设置名称'); // 输出警告信息
        }
    }

    // 新增方法：设置公告内容
    setAnnouncement(announcement: string) {
        if (this.scrollLabel) {
            this.scrollLabel.string = announcement; // 设置滚动公告的内容
            console.log('设置的公告内容:', announcement);
        } else {
            console.warn('scrollLabel 为空，无法设置公告内容');
        }
    }

    // 新增方法：开始滚动动画
    private startScrollAnimation() {
        if (!this.scrollLabel) {
            console.warn('滚动公告 Label 未设置');
            return;
        }

        // 设置初始位置
        this.scrollLabel.node.setPosition(new Vec3(this.startX, this.scrollLabel.node.position.y, 0));

        // 创建滚动动画
        const scrollAction = tween(this.scrollLabel.node)
            .to(this.scrollDuration, { position: new Vec3(this.endX, this.scrollLabel.node.position.y, 0) })
            .delay(this.waitDuration)
            .call(() => {
                // 重置位置并重新开始动画
                this.scrollLabel.node.setPosition(new Vec3(this.startX, this.scrollLabel.node.position.y, 0));
                this.startScrollAnimation();
            });

        // 开始动画
        scrollAction.start();
    }

    // 连接到 WebSocket 服务器
    private connectToServer() {
        this.socket = new WebSocket('ws://localhost:3000');

        this.socket.onopen = () => {
            console.log('大厅场景连接服务器成功');
        };

        this.socket.onmessage = (event) => {
            console.log('大厅收到消息:', event.data);
            const response = JSON.parse(event.data);
            if (response.type === 'announcement') {
                this.setAnnouncement(response.content);
            }
        };

        this.socket.onclose = () => {
            console.log('与服务器断开连接');
        };
    }

    // 请求公告信息
    private requestAnnouncement() {
        if (this.socket.readyState === WebSocket.OPEN) {
            this.socket.send(JSON.stringify({ type: 'request_announcement' }));
        } else {
            console.warn('WebSocket 未连接,无法请求公告');
        }
    }
}


